# -*- coding: utf-8 -*-
from Products.CMFCore.utils import getToolByName
from zope.app.component.hooks import getSite
from plone.dexterity.utils import createContentInContainer
#from Products.ATVocabularyManager.config import TOOL_NAME as ATVOCABULARYTOOL
#from Products.ATVocabularyManager.config import SORT_METHOD_FOLDER_ORDER
#from Products.ATVocabularyManager.utils.vocabs import createHierarchicalVocabs
from Products.ATVocabularyManager.utils.vocabs import createHierarchicalVocabs
from Products.CMFPlone.utils import safe_unicode
from Products.CMFPlone import PloneMessageFactory as _
from Products.CMFPlone.utils import transaction_note
from tesauro.parse_tesauro import importTesauroToVocab


def setupGroups(portal):

    acl_users = getToolByName(portal, 'acl_users')
    if not acl_users.searchGroups(name='Staff'):
        gtool = getToolByName(portal, 'portal_groups')
        gtool.addGroup('Staff', roles=['StaffMember'])
        gtool.addGroup('SalaMuseo', roles=['StaffMember'])
        gtool.addGroup('CemtroDoc', roles=['StaffMember'])
        gtool.addGroup('Circulacion', roles=['StaffMember'])
        gtool.addGroup('Hemeroteca', roles=['StaffMember'])
        gtool.addGroup('Gestion', roles=['GestionMember','StaffMember'])


def importVarious(context):
    """Miscellanous steps import handle
    """

    portal = getSite()

    """
    try:
        mountStructure(portal)
    except :
        print "no se puede crear la estructura"
    """

    #customSizes(portal)
    #creaCategorias(portal)
    #setupGroups(portal)
    #seteaRSS(portal,context)

def seteaRSS(context,base):
    """Habilita el RSS en cada carpeta"""

    from Acquisition import aq_parent, aq_inner
    if base.readDataFile('bpPolicy.policy-rss.txt') is None:
        return

    listIntereses=("recreacion","apoyo-a-la-educacion","investigacion","curiosidades",)
    listOtras=("avisos","noticias")
    if context["home"].has_key("intereses"):
        for carpetaNombre in listIntereses:
            if context["home"]["intereses"].has_key(carpetaNombre):

                message=habilitameEsta(context["home"]["intereses"][carpetaNombre])

                if carpetaNombre=="recreacion":
                    for nomF in context["home"]["intereses"][carpetaNombre].objectIds():
                        folderIt=aq_inner(context["home"]["intereses"][carpetaNombre][nomF])
                        if folderIt.portal_type == "Folder":
                            message=habilitameEsta(folderIt)


            else:
                message=_(u'La Carpeta no existe')

    if context["home"].has_key("conocenos"):
        for capetaN in listOtras:
            if context["home"]["conocenos"].has_key(capetaN):
                message=habilitameEsta(context["home"]["conocenos"][capetaN])
            else:
                message=_(u'La Carpeta no existe')

    else:
        message=_(u'No es posible setear las carpetas')



    context.plone_utils.addPortalMessage(message)

def habilitameEsta(rssFolder):
    """habilita el RSS auna carpeta determinada"""

    psyn=getToolByName(rssFolder,"portal_syndication")
    print "folder:::: "+rssFolder.id
    if psyn.isSiteSyndicationAllowed():
        try:
            if not psyn.isSyndicationAllowed(rssFolder):
                psyn.enableSyndication(rssFolder)
                message=_(u'RSS habilitado')
            else:
                message=_(u'RSS deshabilitado')
        except :
            message=_(u'RSS ya esta activo')
    else:
        message=_(u'RSS no permitido')
    return  message




def customSizes(context):
    from Products.ATContentTypes.content.image import ATImageSchema

    iprops = context.portal_properties.imaging_properties
    iprops.manage_changeProperties(allowed_sizes=[    'large 768:768',\
                                                      'preview 428:428',\
                                                      'thumb 128:128',\
                                                      'tile 58:58',\
                                                      'icon 32:32',\
                                                      'listing 16:16'])

def creaCategorias(context):

    atvm = getToolByName(context, 'portal_vocabularies')
    categoriasVocab= importTesauroToVocab(context)

    """
        {('ciencias_exactas','Ciencias exactas'):{
            ('algebra','Algebra'):{},
            ('geometria','Geometría'):{},
            ('logica','Lógica'):{},
            ('estadistica','Estadística'):{},
            ('topologia','Topología'):{},
            ('ingenieria','Ingenieria'):{},
            ('informatica','Informática'):{},
        },
        ('ciencias_naturales','Ciencias naturales'):{
          ('astronomia','Astronomía'):{},
          ('biologia','Biología'):{},
          ('botanica','Botánica'):{},
          ('ecologia','Ecología'):{},
          ('zoologia','Zoología'):{},
          ('ciencias_de_la_tierra','Ciencias de la tierra'):{},
          ('geografia','Geografía'):{},
          ('oceanografia','Oceanografía'):{},
          ('fisica','Física'):{},
          ('quimica','Química'):{},
          },
        ('ciencias sociales','Ciencias sociales'):{
          ('antropologia','Antropología'):{},
          ('comunicacion','Comunicación'):{},
          ('educacion','Educación'):{},
          ('ciencias_politicas','Ciencias política'):{},
          ('psicologia','Psicología'):{},
          ('sociologia','Sociología'):{},
          ('relaciones_internacionales','Relaciones internacionales'):{},
          ('derecho','Derecho'):{},
          ('economia','Economia'):{},
          ('medicina','Medicina'):{},
          },
        ('humanidades_y_artes','Humanidades y artes'):{
          ('historia_del_arte','Historia del arte'):{},
          ('literatura','Literatura'):{},
          ('historia','Historia'):{},
          ('teologia_y_religion','Teología y Religión'):{},
          ('filosofia','Filosofía'):{},
          ('filologia','Filología'):{},
          ('linguistica','Lingüística'):{},
          ('semiotica','Semiótica'):{},
          ('arquitectura','Arquitectura'):{},
          ('musica','Música'):{},
          ('pintura','Pintura'):{},
          ('escultura','Escultura'):{},
          },}
        """

    hierarchicalVocabs = {}
    hierarchicalVocabs[('categorias_vocab', 'Ramas del conocimiento')] = categoriasVocab
    createHierarchicalVocabs(atvm, hierarchicalVocabs)

def mountStructure(context):
    """Genera la estructura del sitio"""
    print "-------------------------------"
    print "Mount structures"
    print "-------------------------------"

    interesesTypes= ["Products.bpContents.articulo","Products.bpContents.evento","Products.bpContents.galeria","Document","Image","File","Folder"]
    newsTypes=["Products.bpContents.noticia","Document","Image","File","Folder"]
    proyTypes=["Document","Image","File","Folder"]




    folders=[("Home","Carpeta raiz del portal","Products.bpContents.rootFolder","home"),
            ("Intereses","Canales principales del portal","Folder","intereses"),
            ("Conocenos","Informacion institucional de la Biblioteca Publica","Folder","conocenos"),
            ("Usando la Biblioteca","Una muestra de que es lo que te ofrece la biblioteca y donde se encuentra","Folder","usando_la_biblioteca"),
            ("Galerias Multimedia","Fotos, videos e imagenes de la B. P. y su acervo","Folder","galerias"),]

    interesesLista=[
        ("Recreacion","Un canal donde se encuntran materiales y eventos para todos los publicos","Folder","recreacion"),
        ("Apoyo a la Educacion","Canal donde se publican contenidos para los chicos en edad escolar","Folder","apoyo-a-la-educacion"),
        ("Investigacion","Canal con novedades para los investigadores o alumnos y docentes del nivel superior","Folder","investigacion"),
        ("Curiosidades","Un canal donde se publican historias, momentos o hechos que nos llaman la atencion","Folder","curiosidades"),
    ]

    subInteresesLista=[("Reseñas","Comentarios sobre libros que pueden interesarle a los lectores de la BP","Folder","resena"),
    ("Eventos","Calendario de actividades dentro y fuera de la BP","Folder","eventos"),
    ("Adquisiciones","Un listado de los libros que ingresan nuevos a nuestra coleccion","Folder","adquisicion"),
    ("Exposiciones","Galeria de imagenes de las exhibiciones que se realizan en la BP","Folder","expo"),]

    conocenosLista=[
        ("Historia","Historia de la Biblioteca Publica","Document","historia"),
        ("Autoridades","Autoridades de la Biblioteca Publica","Document","autoridades"),
        ("Areas","Areas de la Biblioteca Publica","Folder","areas"),
        ("Noticias","Novedades de la biblioteca y de interes para sus ususarios","Folder","noticias"),
        ("Proyectos","Proyectos que motoriza la Biblioteca Publica","Folder","proyectos"),
    ]
    usandoLista=[
        ("Busqueda de Material","Busqueda de informacion","Document","busqueda_material"),
        ("Hacerse Socio","Como hacerse socio de la Biblioteca Publica","Document","hacete_socio"),
        ("Salas de Lectura","Listado de las distintas salas que tenemos para los lectores","Document","salas")
    ]



    if not hasattr(context,"home"):
        fa=folders[0]
        context.invokeFactory(fa[2],fa[3])
        newF=context[fa[3]]
        newF.title=fa[0]
        newF.description=fa[1]
        newF.reindexObject()
    else:
        print "ya existe la carpeta HOME"

    for f in folders:
        if not hasattr(context.home,f[3]):
            context.home.invokeFactory(id=f[3], type_name=f[2],title=f[0],description=f[1])
            newF = context.home[f[3]]
            newF.setConstrainTypesMode(0)
            newF.setLocallyAllowedTypes(["Document","Folder",])
            newF.setImmediatelyAddableTypes(["Document","Folder",])

            if f[3]=="intereses":
                for sub in interesesLista:
                    if not hasattr(newF,sub[3]):
                        newF.invokeFactory(id=sub[3], type_name=sub[2],title=sub[0],description=sub[1])
                        newS = newF[sub[3]]
                        newS.setConstrainTypesMode(1)
                        newS.setLocallyAllowedTypes(interesesTypes)
                        newS.setImmediatelyAddableTypes(interesesTypes)
                        newS.reindexObject()
                        newF.reindexObject()
                    else:
                        print newF.id + " ya tiene atributo "+sub[3]

            if f[3]=="conocenos":
                for sub in conocenosLista:
                    if not hasattr(newF,sub[3]):
                        newS=newF.invokeFactory(id=sub[3], type_name=sub[2],title=sub[0],description=sub[1])
                        newS=newF[sub[3]]
                    newS.setConstrainTypesMode(1)
                    if sub[3] == "noticias":
                            newS.setLocallyAllowedTypes(newsTypes)
                            newS.setImmediatelyAddableTypes(newsTypes)
                    elif sub[3] == "proyectos":
                        newS.setLocallyAllowedTypes(proyTypes)
                        newS.setImmediatelyAddableTypes(proyTypes)
                        newS.reindexObject()
                        newF.reindexObject()
                    else:
                        print newF.id + " ya tiene atributo "+sub[3]

            if f[3]=="usando_la_biblioteca":
                for sub in usandoLista:
                    if not hasattr(newF,sub[3]):
                        newF.invokeFactory(id=sub[3], type_name=sub[2],title=sub[0],description=sub[1])
                        newS=newF[sub[3]]
                        newS.reindexObject()

    homRecrea=context.home.intereses.recreacion

    if not homRecrea:
        return

    else:
        for categoria in subInteresesLista:
            if not hasattr(homRecrea,categoria[3]):
                print "creando carpets"
                homRecrea.invokeFactory(id=categoria[3], type_name=categoria[2],title=categoria[0],description=categoria[1])
                newCC = homRecrea[categoria[3]]
                newCC.setConstrainTypesMode(1)
                newCC.setLocallyAllowedTypes(interesesTypes)
                newCC.setImmediatelyAddableTypes(interesesTypes)
                newCC.reindexObject()
                homRecrea.reindexObject()
            else:
                print "las carpetas ya existen"

def addHVocab(context,vocD, name):
    site = context
    atvm = getToolByName(site, ATVOCABULARYTOOL)
    hierarchicalVocabs = {}
    hierarchicalVocabs[(name, name)] = vocD

def updateDirectorios(context):
    """Hace el upgrade de Folder to Directorios para las carpetas de intereses"""

    folderInte=context["home"]["intereses"]
    tmpFolder=creaDirectorio(folderInte,"tmpFolder")
    listadoF=folderInte.getFolderContents()

    ##listo todas las carpetas en el folder intereses
    for brain in listadoF:
        ##si es del tipo folder ejecuto el filtro
        if brain.portal_type=="Folder":
            actuF=brain.getObject()
            newDirObj=dict ()
            newDirObj["id"]=actuF.id
            newDirObj["title"]=actuF.Title()
            newDirObj["subject"]=actuF.Subject()
            newDirObj["description"]=actuF.Description()

            ##junto todos los ids de los contenidos en la carpeta
            listId=[]
            for item in actuF.getFolderContents():
                listId.append(item.id)

            import pdb
            pdb.set_trace()

            if len(listId)>0:
                ##Corto y pego de la carpeta al folder TMP
                print "cortando de %s" %actuF.Title()
                actuF.manage_cutObjects(listId)
                tmpFolder.manage_pasteObjects()

            ##Borro la carpeta vieja
            folderInte.manage_delObjects(actuF.id)

            ##Creo el nuevo DIrectorio
            newDir=creaDirectorio(folderInte,newDirObj["title"])
            newDir.setDescription(newDirObj["description"])

            ##Otra vez recolecto todos los ids de los elementos en folder TMP
            listId=[]
            for item in tmpFolder.getFolderContents():
                listId.append(item.id)
            if len(listId)>0:
                ###Corto y pego en el Directorio nuevo
                tmpFolder.manage_cutObjects(listId)
                newDir.manage_pasteObjects()

    ##borro la carpeta temporal
    folderInte.manage_delObjects(tmpFolder.id)

def creaDirectorio(folder,nombre):
    from plone.dexterity.utils import createContentInContainer
    newDirect= createContentInContainer(folder, "Products.bpContents.directorio", title=nombre)
    return newDirect
